home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / MAC_PRGS.M2 / KEYCODES.M < prev    next >
Encoding:
Text File  |  1995-07-16  |  4.0 KB  |  177 lines

  1. MODULE KeyCodes; (*$E MOS *)
  2. (*$C-*)
  3.  
  4. (*
  5.  * "Quick-And-Dirty"-Programm zum Anzeigen der Tastenkodes
  6.  *)
  7.  
  8. import tosio;
  9. from keyboard import specialcode, cap;
  10.  
  11. IMPORT inout;
  12. IMPORT keyboard;
  13. IMPORT SYSTEM, SysUtil2, MOSGlobals, MOSSupport;
  14.  
  15.  
  16. MODULE KbdCtrl;
  17. (*$L-*)
  18.  
  19. FROM SYSTEM IMPORT ASSEMBLER;
  20. FROM SYSTEM IMPORT ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD;
  21. FROM MOSSupport IMPORT ToSuper, ToUser;
  22.  
  23. EXPORT GetKey, Key, CtrlKey, CtrlSet;
  24.  
  25. TYPE    CtrlKey = ( rshift, lshift, control, alternate, capsLock );
  26.         CtrlSet = SET OF CtrlKey;
  27.  
  28.         Key = RECORD
  29.                 ch  : CHAR;
  30.                 ctrl: CtrlSet;
  31.                 scan: CARDINAL;
  32.               END;
  33.  
  34. VAR KbdRec: ADDRESS;
  35.  
  36. TYPE KbdRecT= RECORD
  37.                 buf:  ADDRESS;
  38.                 size: CARDINAL;
  39.                 head: CARDINAL;      (* hiernach steht die nächste Taste an *)
  40.                 tail: CARDINAL;      (* hier hinter kommt nächste Taste rein *)
  41.               END;
  42.  
  43. PROCEDURE asn;
  44.   BEGIN
  45.     ASSEMBLER
  46.         MOVE.B  D0,Key.ch(A2)
  47.         SWAP    D0
  48.         CLR     D1
  49.         MOVE.B  D0,D1
  50.         MOVE    D1,Key.scan(A2)
  51.         LSR     #8,D0
  52.         ANDI    #11111%,D0
  53.         MOVE.B  D0,Key.ctrl(A2)
  54.     END
  55.   END asn;
  56.  
  57. PROCEDURE GetKey (VAR k: Key; VAR ok: BOOLEAN);
  58.   BEGIN
  59.     ASSEMBLER
  60.         MOVE.L  -(A3),A1        ; ok
  61.         MOVE.L  -(A3),A2        ; k
  62.         MOVE.L  KbdRec,A0
  63.         MOVE    KbdRecT.head(A0),D1
  64.         CMP     KbdRecT.tail(A0),D1
  65.         BEQ     n
  66.         MOVE    #1,(A1)
  67.         ADDQ    #4,D1
  68.         CMP     KbdRecT.size(A0),D1
  69.         BCS     o
  70.         CLR     D1
  71.      o: MOVE    D1,KbdRecT.head(A0)
  72.         MOVE.L  KbdRecT.buf(A0),A1
  73.         MOVE.L  0(A1,D1.W),D0
  74.         JMP     asn
  75.      n: CLR.L   (A2)
  76.         CLR     (A1)
  77.     END
  78.   END GetKey;
  79.  
  80. PROCEDURE SetExtMode ( VAR lastMode: BOOLEAN );
  81.   BEGIN
  82.     ASSEMBLER
  83.         SUBQ.L  #4,A7
  84.         JSR     ToSuper
  85.         BSET    #3,$484
  86.         SNE     D0
  87.         ANDI    #1,D0
  88.         MOVE.L  -(A3),A0
  89.         MOVE    D0,(A0)
  90.         JSR     ToUser
  91.         ADDQ.L  #4,A7
  92.     END
  93.   END SetExtMode;
  94.  
  95. PROCEDURE CurrentMode (): BOOLEAN;
  96.   BEGIN
  97.     ASSEMBLER
  98.         SUBQ.L  #4,A7
  99.         JSR     ToSuper
  100.         BTST    #3,$484
  101.         SNE     D0
  102.         ANDI    #1,D0
  103.         MOVE    D0,(A3)+
  104.         JSR     ToUser
  105.         ADDQ.L  #4,A7
  106.     END
  107.   END CurrentMode;
  108.  
  109. PROCEDURE SetMode ( extended: BOOLEAN );
  110.   BEGIN
  111.     ASSEMBLER
  112.         SUBQ.L  #4,A7
  113.         JSR     ToSuper
  114.         TST     -(A3)
  115.         BNE     setit
  116.         BCLR    #3,$484
  117.         BRA     ret
  118.   setit BSET    #3,$484
  119.   ret:  JSR     ToUser
  120.         ADDQ.L  #4,A7
  121.     END
  122.   END SetMode;
  123.  
  124. BEGIN
  125.   ASSEMBLER
  126.         ; I/O-Buffer f. Tastatur ermitteln
  127.         MOVE    #1,-(A7)
  128.         MOVE    #14,-(A7)
  129.         TRAP    #14         ; iorec (kbd)
  130.         ADDQ.L  #4,A7
  131.         MOVE.L  D0,KbdRec
  132.   END;
  133.   SetMode (TRUE);
  134. END KbdCtrl;
  135. (*$L=*)
  136.  
  137. var i,o,n:CARDINAL;c:char;
  138.  sk: specialcode; k,k2:key;
  139.  
  140. PROCEDURE show;
  141.   begin
  142.     inout.WriteString ('  ');
  143.     if lshift in k.ctrl then inout.writestring ('LS') else inout.writestring ('  ') end;
  144.     inout.Write(' ');
  145.     if rshift in k.ctrl then inout.writestring ('RS') else inout.writestring ('  ') end;
  146.     inout.Write(' ');
  147.     if control in k.ctrl then inout.write ('C') else inout.write (' ') end;
  148.     inout.Write(' ');
  149.     if alternate in k.ctrl then inout.write ('A') else inout.write (' ') end;
  150.     inout.WriteString ('  ');
  151.     inout.writehex (k.scan,3);
  152.     inout.WriteString ('  ');
  153.     inout.writehex (ord(k.ch),3);
  154.     if k.ch>' ' then
  155.       inout.WriteString ('  ');
  156.       inout.write (k.ch)
  157.     else
  158.       inout.WriteString ('   ');
  159.     end;
  160.     inout.writeln;
  161.   end show;
  162.  
  163. var ok: BOOLEAN;
  164.  
  165. begin
  166.   inout.writeln;
  167.   inout.WriteString ('Ende mit "%".');
  168.   inout.writeln;
  169.   loop
  170.     repeat
  171.       GetKey (k, ok);
  172.     until ok;
  173.     if k.ch='%' then exit end;
  174.     show;       (* key-werte zeigen *)
  175.   end;
  176. END KeyCodes.
  177.